package org.example;

import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import java.util.Random;
import java.util.ArrayList;
import java.util.List;

/**
 * 实验任务3：Apache Commons Math3统计计算
 * 学生姓名：易信志
 * 学号：202411671429
 * 
 * 使用DescriptiveStatistics计算均值
 */
public class Task3 {
    public static void main(String[] args) {
        System.out.println("=== 实验任务3：Apache Commons Math3统计计算 ===");
        System.out.println("学生姓名：易信志");
        System.out.println("学号：202411671429");
        System.out.println();

        // 个人信息数据
        String studentName = "易信志";
        String studentId = "202411671429";
        int seed = 1429; // 学号后4位作为随机数种子

        System.out.println("=== 任务1：数据生成 ===");
        // 功能：创建Random对象并生成10个double类型数据
        // 参数：long seed - 随机数种子（学号后4位：1429）
        // 返回值：Random - 随机数生成器对象
        Random random = new Random(seed);
        System.out.println("随机数种子: " + seed + " (学号后4位)");

        // 生成10个double类型数据
        List<Double> doubleList = new ArrayList<>();
        System.out.println("生成10个double类型数据：");
        for (int i = 0; i < 10; i++) {
            double value = random.nextDouble() * 100; // 生成0-100之间的随机数
            doubleList.add(value);
            System.out.printf("数据%d: %.4f%n", i + 1, value);
        }
        System.out.println();

        System.out.println("=== 任务2：数据准备 ===");
        // 功能：创建DescriptiveStatistics对象并添加数据
        // 参数：无
        // 返回值：DescriptiveStatistics - 描述性统计对象
        DescriptiveStatistics ds = new DescriptiveStatistics();
        System.out.println("创建DescriptiveStatistics对象");

        // 使用addValue()方法将生成的数据添加到统计对象中
        // 功能：向统计对象添加数值
        // 参数：double value - 要添加的数值
        // 返回值：void
        for (Double value : doubleList) {
            ds.addValue(value);
        }
        System.out.println("已向DescriptiveStatistics对象添加" + doubleList.size() + "个数据点");
        System.out.println();

        System.out.println("=== 任务3：计算均值 ===");
        // 功能：使用DescriptiveStatistics的getMean()方法计算均值
        // 参数：无
        // 返回值：double - 所有数据的算术平均值
        double mean = ds.getMean();

        System.out.println("学生" + studentName + "的数据统计结果：");
        System.out.println("数据点数量: " + ds.getN());
        System.out.println("均值: " + String.format("%.4f", mean));
        System.out.println();

        // 额外统计信息展示
        System.out.println("=== 额外统计信息 ===");
        // 功能：获取标准差
        // 参数：无
        // 返回值：double - 标准差
        double standardDeviation = ds.getStandardDeviation();
        System.out.println("标准差: " + String.format("%.4f", standardDeviation));

        // 功能：获取最小值
        // 参数：无
        // 返回值：double - 最小值
        double min = ds.getMin();
        System.out.println("最小值: " + String.format("%.4f", min));

        // 功能：获取最大值
        // 参数：无
        // 返回值：double - 最大值
        double max = ds.getMax();
        System.out.println("最大值: " + String.format("%.4f", max));
        System.out.println();

        // 输出所有处理结果汇总
        System.out.println("=== 所有处理结果汇总 ===");
        System.out.println("学生信息: " + studentName + " (" + studentId + ")");
        System.out.println("随机数种子: " + seed);
        System.out.println("生成数据点数量: " + ds.getN());
        System.out.println("均值: " + String.format("%.4f", mean));
        System.out.println("标准差: " + String.format("%.4f", standardDeviation));
        System.out.println("数据范围: [" + String.format("%.4f", min) + ", " + String.format("%.4f", max) + "]");

        System.out.println("\n=== 实验任务3完成 ===");
    }
}
